Gioco memory javascript

<!doctype html>
<html>
<head>
<meta charset=”utf-8>
<title>Memory Game</title>
<meta name=”authorcontent=”Prof. Marco Palladino>
<!–link rel=”stylesheet” href=”styles.css”–>
<style>
.tavolo {
display: grid;
grid-template-columns: 100px 100px 100px 100px 100px;
grid-gap: 10px;
background-color: #fff;
}
</style>
</head>
<body>
<h3>Score:<span id=”result></span></h3>
<div class=”tavolo>
</div>
<script>
// avvio il programma solo dopo che il Browser ha terminato di elaborare le istruzioni HTML
// DOM = Document Object Model e’ la rappresentazione interna del documento descritto con il linguaggio HTML
// Il programma Javascript viene eseguito su questa rappresentazione interna
// e’ quindi importante che questo processo di traduzione del file testo HTML sia completato prima che il
// codice Javascript venga eseguito
document.addEventListener(‘DOMContentLoaded’, () => {
// carte
// la sequenza di carte che verranno posizionate sul tavolo da gioco
const carteArray = [
{ // posizioneN 0 sul tavolo da gioco
name: ‘whale’,
img: ‘images/whale.png’
},
{ // posizioneN 1 sul tavolo da gioco
name: ‘seeHorse’,
img: ‘images/seeHorse.png’
},
{
name: ‘seeStar’,
img: ‘images/seeStar.png’
},
{
name: ‘seeShell’,
img: ‘images/seeShell.png’
},
{
name: ‘stingRay’,
img: ‘images/stingRay.png’
},
{
name: ‘shark’,
img: ‘images/shark.png’
},
{
name: ‘ballFish’,
img: ‘images/ballFish.png’
},
{
name: ‘delphin’,
img: ‘images/delphin.png’
},
{
name: ‘turtle’,
img: ‘images/turtle.png’
},
{
name: ‘crab’,
img: ‘images/crab.png’
},
{ // ripeto la sequenza perche’ devo avere 2 carte dello stesso tipo per ogni figura
name: ‘whale’,
img: ‘images/whale.png’
},
{
name: ‘seeHorse’,
img: ‘images/seeHorse.png’
},
{
name: ‘seeStar’,
img: ‘images/seeStar.png’
},
{
name: ‘seeShell’,
img: ‘images/seeShell.png’
},
{
name: ‘stingRay’,
img: ‘images/stingRay.png’
},
{
name: ‘shark’,
img: ‘images/shark.png’
},
{
name: ‘ballFish’,
img: ‘images/ballFish.png’
},
{
name: ‘delphin’,
img: ‘images/delphin.png’
},
{
name: ‘turtle’,
img: ‘images/turtle.png’
},
{
name: ‘crab’,
img: ‘images/crab.png’
}
]
// tavolo di gioco
const tavolo = document.querySelector(‘.tavolo’);
// posiziona le carte sul tavolo di gioco
function memory() {
// distribuiamo le carte sul tavolo di gioco
for(let posizioneN = 0; posizioneN < carteArray.length; posizioneN++) {
// creo un posto sul tavolo per una carta
var carta = document.createElement(‘img’);
// inizialmente la carta e’ girata e quindi non mostra la figura
carta.setAttribute(‘src’, ‘images/blank.png’);
// visto che le immagini delle carte non sono perfettamente ritagliate
// le ridimendiono per renderle tutte perfettamente uguali
carta.setAttribute(‘width’, 100);
carta.setAttribute(‘height’, 100);
// ogni posto sul tavolo viene identificato con un numero
// il numero viene aggiunto all’elemento IMG sotto forma di attributo
carta.setAttribute(‘carta-numero’, posizioneN);
// aggiungo alla carta la possibilita’ di poter essere scoperta/girata
// cliccando sulla carta eseguiro’ una funzione che la scopre
carta.addEventListener(‘click’, scopriCarta);
// finalmente posiziono la carta sul tavolo
tavolo.appendChild(carta);
}
}
// scopri la carta
var carteScelte = []; // il nome delle carte scelte
var carteScelteN = []; // il numero che identifica la posizione (posizioneN) della carta sul tavolo di gioco
// richiamata quando una carta viene cliccata, mostra la figura che mostrerebbe la carta una volta girata
function scopriCarta() {
// la parola chiave “this”/questa si riferisce alla carta (elemento HTML) che ha richiamato la funzione
// leggendo l’attributo possiamo sapere la posizioneN della carta scelta(cliccata) sul tavolo di gioco
var cartaN = this.getAttribute(‘carta-numero’);
// I fini di seguire il funzionamento del programma e verificarne la correttezza
// uso la console per scrivere delle informazioni che aiutano durante lo sviluppo
console.log(‘scopri carta: ‘+ cartaN);
// memorizzo in un Array “carteScelte” il nome della carta scelta
// notate che alla posizione della carta sul tavolo corrisponde la carta nell’Array di carteArray
carteScelte.push(carteArray[cartaN].name);
// memorizzo in un Array “carteScelteN” la posizioneN della carta scelta sul tavolo di gioco
carteScelteN.push(cartaN);
// cambiamo l’immagine associata all’elemento prescelto
// con l’immagine che avevamo memorizzato nell’ARRAY “carteArray”
// questa operazione inizia una sequeza di operazioni da parte del Browser per sostituire
// l’immagine dell’elemento IMG, questa operazione puo’ richiedere un po’ di tempo
this.setAttribute(‘src’, carteArray[cartaN].img);
// se il numero di carte scelte e’ 2, richiamo la funzione “controllaCarte”, ma lo faccio
// dopo un certo intervallo di tempo (100ms) per dare tempo al Browser di completare
// la sostituzione dell’immagine dell’ultima carta scoperta.
// Questo e’ necessario perche’ Javascript e’ un linguaggio asyncrono, e mentre il browser avvia la sequenza
// per la sostituzione dell’immagine, il resto del codice viene eseguito in contemporanea
if(carteScelte.length === 2) setTimeout(controllaCarte, 100);
}
function controllaCarte() {
carte = document.querySelectorAll(‘img’);
if(carteScelte[0] === carteScelte[1]) { // le carte scelte coincidono
// devo rimuovere le carte dal tavolo di gioco
alert(‘Bravo +1’);
// sostituisco l’immagine della carta con una vuota (stesso colore dello sfondo)
carte[carteScelteN[0]].setAttribute(‘src’, ‘images/vuota.png’);
// rimuovo la chiamata alla funzione “scopriCarta” per la carta
carte[carteScelteN[0]].removeEventListener(‘click’, scopriCarta);
// ripeto per la seconda carta
carte[carteScelteN[1]].setAttribute(‘src’, ‘images/vuota.png’);
carte[carteScelteN[1]].removeEventListener(‘click’, scopriCarta);
} else { // le carte scelte non coincidono
alert(“Booo! Prova di nuovo sarai piu’ fortunato”);
// sostituisco l’immagine della carta con l’immagine della carte girata
carte[carteScelteN[0]].setAttribute(‘src’, ‘images/blank.png’);
carte[carteScelteN[1]].setAttribute(‘src’, ‘images/blank.png’);
}
// in entrambi i casi svuoto l’array delle carte scelte per il nuovo turno di gioco
carteScelte = [];
carteScelteN = [];
}
memory();
});
</script>
</body>
</html>
Precedente Numeri casuali su JavaScript Successivo Java script: tabelline e grafica